import javax.swing.ImageIcon;
import javax.swing.KeyStroke;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.ButtonGroup;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JCheckBoxMenuItem;
import java.awt.event.KeyEvent;
import java.awt.event.InputEvent;
import java.net.URLClassLoader;

/** 
 * GMenuBar represents the main menu of the application.
 *
 * @version 1.0
 * @author P.Jaya Krishna
 */
class GMenuBar extends JMenuBar
{
	JMenuItem menuEditUndo;
	JMenuItem menuEditRedo;
	JCheckBoxMenuItem menuToolsShowWeights;
	JRadioButtonMenuItem menuToolsOpSelection;
	JRadioButtonMenuItem menuToolsOpVertex;
	JRadioButtonMenuItem menuToolsOpEdge;
	JCheckBoxMenuItem menuToolsShowStepByStep;
	JMenuItem menuToolsAdjustSpeed;
	private JMenu menuFile;
	private JMenu menuEdit;
	private JMenu menuRun;
	private JMenu menuTools;
	private JMenu menuHelp;
	
	/**
	 * Creates a GMenuBar object with the specified handler
	 */
	public GMenuBar(MenuHandler menuHandler)
	{
		super();
		//URLClassLoader cl 			= (URLClassLoader)getClass().getClassLoader();
		
		menuFile    				= new JMenu("File");
		menuEdit    				= new JMenu("Edit");
		menuRun     				= new JMenu("Run");
		menuTools   				= new JMenu("Tools");
		menuHelp    				= new JMenu("Help");
		JMenu menuToolsOp 			= new JMenu("Operation");
		
		JMenuItem menuFileNew		= new JMenuItem("New", new ImageIcon
										("images/new.png"));
		JMenuItem menuFileOpen		= new JMenuItem("Open", new ImageIcon
										("images/open.gif"));
		JMenuItem menuFileSave		= new JMenuItem("Save", new ImageIcon
										("images/save.gif"));
		JMenuItem menuFileSaveAs	= new JMenuItem("Save As...", new ImageIcon
										("images/saveall.gif"));
		JMenuItem menuFileExit		= new JMenuItem("Exit", new ImageIcon
										("images/cancel.gif"));
		JMenuItem menuFilePrint		= new JMenuItem("Print...", new ImageIcon
										("images/print.gif"));
		JMenuItem menuFilePP		= new JMenuItem("Print Preview", new ImageIcon
										("images/printpreview.gif"));
		JMenuItem menuFilePageSetup	= new JMenuItem("Page Setup...");
		
		menuEditUndo				= new JMenuItem("Undo", new ImageIcon
										("images/undo.gif"));
		menuEditRedo				= new JMenuItem("Redo", new ImageIcon
										("images/redo.gif"));
		JMenuItem menuEditRefresh	= new JMenuItem("Refresh", new ImageIcon
										("images/refresh.png"));
		
		JMenuItem menuRunBFS  		= new JMenuItem("BFS");
		JMenuItem menuRunDFS  		= new JMenuItem("DFS");
		JMenuItem menuRunDSP  		= new JMenuItem("Shortest Path");
		JMenuItem menuRunPMST 		= new JMenuItem("Prim's MST");
		JMenuItem menuRunKMST 		= new JMenuItem("Kruskal's MST");
		JMenuItem menuRunTS   		= new JMenuItem("Topological Sort");
		JMenuItem menuRunET   		= new JMenuItem("Euler Tour");
		JMenuItem menuRunLP   		= new JMenuItem("Longest Path");
		JMenuItem menuRunMF   		= new JMenuItem("Maximum Flow");
		JMenuItem menuRunCPA  		= new JMenuItem("Critical Path Analysis");
		JMenuItem menuRunGC   		= new JMenuItem("Graph Coloring");
		JMenuItem menuRunTSP  		= new JMenuItem("Travelling Salesman Problem");
		JMenuItem menuRunHT   		= new JMenuItem("Hamilton Tour");
		
		menuToolsShowWeights        = new JCheckBoxMenuItem("Show Weights", true);
		JMenuItem menuToolsAdjMatrix= new JMenuItem("Adjacency Matrix");
		JMenu menuToolsAnimation	= new JMenu("Animation");
		menuToolsShowStepByStep		= new JCheckBoxMenuItem("Graph Animation");
		menuToolsAdjustSpeed		= new JMenuItem("Adjust Animation Speed");
		ButtonGroup menuToolsOpGroup= new ButtonGroup();
		menuToolsOpSelection        = new JRadioButtonMenuItem("Selection Mode", true);
		menuToolsOpVertex           = new JRadioButtonMenuItem("Vertex Mode", false);
		menuToolsOpEdge				= new JRadioButtonMenuItem("Edge Mode", false);
		
		JMenuItem menuHelpGHelp		= new JMenuItem("GRASP Help", new ImageIcon
										("images/help.gif"));
		JMenuItem menuHelpSScreen	= new JMenuItem("Splash Screen...");
		JMenuItem menuHelpAbout		= new JMenuItem("About GRASP...", new ImageIcon
										("images/about.gif"));
		
		// setting mnemonics
		menuFile.setMnemonic('F');
		menuEdit.setMnemonic('E');
		menuRun.setMnemonic('R');
		menuTools.setMnemonic('T');
		menuHelp.setMnemonic('H');
		
		menuFileNew.setMnemonic('N');
		menuFileOpen.setMnemonic('O');
		menuFileSave.setMnemonic('S');
		menuFileSaveAs.setMnemonic('A');
		menuFileExit.setMnemonic('X');
		menuFilePrint.setMnemonic('P');
		menuFilePageSetup.setMnemonic('U');
		menuFilePP.setMnemonic('T');
		
		menuEditUndo.setMnemonic('U');
		menuEditRedo.setMnemonic('R');
		menuEditRefresh.setMnemonic('F');
		
		menuRunBFS.setMnemonic('B');
		menuRunDFS.setMnemonic('D');
		menuRunDSP.setMnemonic('S');
		menuRunPMST.setMnemonic('P');
		menuRunKMST.setMnemonic('K');
		menuRunTS.setMnemonic('T');
		menuRunET.setMnemonic('E');
		menuRunLP.setMnemonic('L');
		menuRunMF.setMnemonic('M');
		menuRunCPA.setMnemonic('C');
		menuRunGC.setMnemonic('G');
		menuRunTSP.setMnemonic('T');
		menuRunHT.setMnemonic('H');
		
		menuToolsShowWeights.setMnemonic('W');
		menuToolsAdjMatrix.setMnemonic('M');
		menuToolsAnimation.setMnemonic('A');
		menuToolsShowStepByStep.setMnemonic('S');
		menuToolsAdjustSpeed.setMnemonic('A');
		menuToolsOp.setMnemonic('O');
		menuToolsOpSelection.setMnemonic('S');
		menuToolsOpVertex.setMnemonic('V');
		menuToolsOpEdge.setMnemonic('E');
		
		menuHelpSScreen.setMnemonic('S');
		menuHelpGHelp.setMnemonic('H');
		menuHelpAbout.setMnemonic('A');
		
		// set accelerators
		menuFileNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
		menuFileOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
		menuFileSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
		menuFilePrint.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK));
		menuFileExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, InputEvent.ALT_MASK));
		
		menuEditUndo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));
		menuEditRedo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_MASK));
		menuEditRefresh.setAccelerator(KeyStroke.getKeyStroke("F5"));
		menuHelpGHelp.setAccelerator(KeyStroke.getKeyStroke("F1"));
		
		// adding to the menuitems to submenus,menuitems and submenus to menus
		// and menus to menubar
		menuFile.add(menuFileNew);
		menuFile.add(menuFileOpen);
		menuFile.addSeparator();
		menuFile.add(menuFileSave);
		menuFile.add(menuFileSaveAs);
		menuFile.addSeparator();
		menuFile.add(menuFilePrint);
		menuFile.add(menuFilePP);
		menuFile.add(menuFilePageSetup);
		menuFile.addSeparator();
		menuFile.add(menuFileExit);
		
		menuEdit.add(menuEditUndo);
		menuEdit.add(menuEditRedo);
		menuEdit.addSeparator();
		menuEdit.add(menuEditRefresh);
		
		menuRun.add(menuRunBFS);
		menuRun.add(menuRunDFS);
		menuRun.add(menuRunDSP);
		menuRun.add(menuRunPMST);
		menuRun.add(menuRunKMST);
		menuRun.add(menuRunTS);
		menuRun.add(menuRunET);
		menuRun.add(menuRunLP);
		menuRun.add(menuRunMF);
		menuRun.add(menuRunCPA);
		menuRun.add(menuRunGC);
		menuRun.add(menuRunTSP);
		menuRun.add(menuRunHT);
		
		menuTools.add(menuToolsShowWeights);
		menuTools.add(menuToolsAdjMatrix);
		menuTools.add(menuToolsAnimation);
		menuToolsAnimation.add(menuToolsShowStepByStep);
		menuToolsAnimation.add(menuToolsAdjustSpeed);
		
		menuTools.addSeparator();
		menuToolsOpGroup.add(menuToolsOpSelection);
		menuToolsOpGroup.add(menuToolsOpVertex);
		menuToolsOpGroup.add(menuToolsOpEdge);
		menuToolsOp.add(menuToolsOpSelection);
		menuToolsOp.add(menuToolsOpVertex);
		menuToolsOp.add(menuToolsOpEdge);
		menuTools.add(menuToolsOp);
		
		menuHelp.add(menuHelpGHelp);
		menuHelp.add(menuHelpSScreen);
		menuHelp.addSeparator();
		menuHelp.add(menuHelpAbout);
		
		add(menuFile);
		add(menuEdit);
		add(menuRun);
		add(menuTools);
		add(menuHelp);
		
		// adding action listener to menu items
		menuFileNew.addActionListener(menuHandler);
		menuFileOpen.addActionListener(menuHandler);
		menuFileSave.addActionListener(menuHandler);
		menuFileSaveAs.addActionListener(menuHandler);
		menuFileExit.addActionListener(menuHandler);
		menuFilePrint.addActionListener(menuHandler);
		menuFilePP.addActionListener(menuHandler);
		menuFilePageSetup.addActionListener(menuHandler);
		
		menuEditUndo.addActionListener(menuHandler);
		menuEditRedo.addActionListener(menuHandler);
		menuEditRefresh.addActionListener(menuHandler);
		
		menuRunBFS.addActionListener(menuHandler);
		menuRunDFS.addActionListener(menuHandler);
		menuRunDSP.addActionListener(menuHandler);
		menuRunPMST.addActionListener(menuHandler);
		menuRunKMST.addActionListener(menuHandler);
		menuRunTS.addActionListener(menuHandler);
		menuRunET.addActionListener(menuHandler);
		menuRunLP.addActionListener(menuHandler);
		menuRunMF.addActionListener(menuHandler);
		menuRunCPA.addActionListener(menuHandler);
		menuRunGC.addActionListener(menuHandler);
		menuRunTSP.addActionListener(menuHandler);
		menuRunHT.addActionListener(menuHandler);
		
		menuToolsShowWeights.addActionListener(menuHandler);
		menuToolsAdjMatrix.addActionListener(menuHandler);
		menuToolsShowStepByStep.addActionListener(menuHandler);
		menuToolsAdjustSpeed.addActionListener(menuHandler);
		menuToolsOpSelection.addActionListener(menuHandler);
		menuToolsOpVertex.addActionListener(menuHandler);
		menuToolsOpEdge.addActionListener(menuHandler);
		
		menuHelpGHelp.addActionListener(menuHandler);
		menuHelpSScreen.addActionListener(menuHandler);
		menuHelpAbout.addActionListener(menuHandler);
		
		menuToolsShowStepByStep.setSelected(true);
		// disabling undo and redo at startup
		menuEditUndo.setEnabled(false);
		menuEditRedo.setEnabled(false);
	}
	
	public void disable()
	{
		menuFile.setEnabled(false);
		menuEdit.setEnabled(false);
		menuRun.setEnabled(false);
		menuTools.setEnabled(false);
		menuHelp.setEnabled(false);
	}
	
	public void enable()
	{
		menuFile.setEnabled(true);
		menuEdit.setEnabled(true);
		menuRun.setEnabled(true);
		menuTools.setEnabled(true);
		menuHelp.setEnabled(true);
	}
}